package com.bank.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.dto.Result;
import com.bank.entity.CardInfo;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 银行卡信息服务接口
 * 提供银行卡信息相关的业务逻辑处理
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
public interface CardInfoService {

    /**
     * 新增银行卡（开户）
     * 
     * @param cardInfo 银行卡信息
     * @return 操作结果
     */
    Result<CardInfo> addCard(CardInfo cardInfo);

    /**
     * 根据卡号删除银行卡（销户）
     *
     * @param cardId 卡号
     * @return 操作结果
     */
    Result<String> deleteCard(String cardId);

    /**
     * 销户取款（一次性取出所有余额并销户）
     *
     * @param cardId 卡号
     * @param password 密码
     * @param remark 备注
     * @return 操作结果，包含取出的金额
     */
    Result<BigDecimal> closeAccountWithdraw(String cardId, String password, String remark);

    /**
     * 批量删除银行卡
     * 
     * @param cardIds 卡号列表
     * @return 操作结果
     */
    Result<String> batchDeleteCards(List<String> cardIds);

    /**
     * 修改银行卡信息
     * 
     * @param cardInfo 银行卡信息
     * @return 操作结果
     */
    Result<CardInfo> updateCard(CardInfo cardInfo);

    /**
     * 根据卡号查询银行卡信息
     * 
     * @param cardId 卡号
     * @return 银行卡信息
     */
    Result<CardInfo> getCardById(String cardId);

    /**
     * 根据卡号查询银行卡详细信息（关联客户和存款类型）
     * 
     * @param cardId 卡号
     * @return 银行卡详细信息
     */
    Result<CardInfo> getCardDetailById(String cardId);

    /**
     * 根据客户ID查询银行卡列表
     * 
     * @param customerId 客户ID
     * @return 银行卡列表
     */
    Result<List<CardInfo>> getCardsByCustomerId(Integer customerId);

    /**
     * 根据客户姓名模糊查询银行卡
     * 
     * @param customerName 客户姓名
     * @return 银行卡列表
     */
    Result<List<CardInfo>> getCardsByCustomerNameLike(String customerName);

    /**
     * 根据开卡日期范围查询银行卡（范围查询）
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 银行卡列表
     */
    Result<List<CardInfo>> getCardsByOpenDateRange(LocalDate startDate, LocalDate endDate);

    /**
     * 根据余额范围查询银行卡（范围查询）
     * 
     * @param minBalance 最小余额
     * @param maxBalance 最大余额
     * @return 银行卡列表
     */
    Result<List<CardInfo>> getCardsByBalanceRange(BigDecimal minBalance, BigDecimal maxBalance);

    /**
     * 分页查询银行卡信息（支持多条件组合查询）
     * 
     * @param page 分页参数
     * @param cardId 卡号（可选，精确查询）
     * @param customerName 客户姓名（可选，模糊查询）
     * @param savingId 存款类型ID（可选）
     * @param isReportLoss 是否挂失（可选）
     * @param startDate 开卡开始日期（可选）
     * @param endDate 开卡结束日期（可选）
     * @param minBalance 最小余额（可选）
     * @param maxBalance 最大余额（可选）
     * @return 分页结果
     */
    Result<IPage<CardInfo>> getCardsPage(Page<CardInfo> page, String cardId, String customerName, Integer savingId,
                                        Boolean isReportLoss, LocalDate startDate, LocalDate endDate,
                                        BigDecimal minBalance, BigDecimal maxBalance);

    /**
     * 验证银行卡密码
     * 
     * @param cardId 卡号
     * @param password 密码
     * @return 验证结果
     */
    Result<Boolean> validatePassword(String cardId, String password);

    /**
     * 修改银行卡密码
     * 
     * @param cardId 卡号
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 操作结果
     */
    Result<String> changePassword(String cardId, String oldPassword, String newPassword);

    /**
     * 银行卡挂失
     * 
     * @param cardId 卡号
     * @param password 密码
     * @return 操作结果
     */
    Result<String> reportLoss(String cardId, String password);

    /**
     * 银行卡解挂
     * 
     * @param cardId 卡号
     * @param password 密码
     * @return 操作结果
     */
    Result<String> cancelReportLoss(String cardId, String password);

    /**
     * 存款操作
     * 
     * @param cardId 卡号
     * @param amount 存款金额
     * @param remark 备注
     * @return 操作结果
     */
    Result<BigDecimal> deposit(String cardId, BigDecimal amount, String remark);

    /**
     * 取款操作
     * 
     * @param cardId 卡号
     * @param password 密码
     * @param amount 取款金额
     * @param remark 备注
     * @return 操作结果
     */
    Result<BigDecimal> withdraw(String cardId, String password, BigDecimal amount, String remark);

    /**
     * 查询余额
     * 
     * @param cardId 卡号
     * @param password 密码
     * @return 余额
     */
    Result<BigDecimal> getBalance(String cardId, String password);

    /**
     * 生成新的银行卡号
     * 
     * @return 新的银行卡号
     */
    Result<String> generateNewCardId();

    /**
     * 获取银行卡统计信息
     * 
     * @return 统计信息
     */
    Result<Object> getCardStatistics();

    /**
     * 导出银行卡信息到CSV文件
     * 
     * @return CSV文件内容
     */
    Result<String> exportCardsToCSV();

    /**
     * 验证银行卡信息的完整性和合法性
     * 
     * @param cardInfo 银行卡信息
     * @return 验证结果
     */
    Result<Void> validateCardInfo(CardInfo cardInfo);
}
